aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)/[username]/accepted
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2025-07-11 10:51:59 -0700
committerAdam Soltys <[email protected]>2025-07-11 10:51:59 -0700
commit7617102b14e5254c9675b7db34f12ff6906a0086 (patch)
tree72251508cc25870b8fe0e91f59b14c15f820aaed /src/routes/(app)/[username]/accepted
parent24de5b9508aef3489fb27a5d3a9cd6de960cbbde (diff)
downloadcoinos-ui-7617102b14e5254c9675b7db34f12ff6906a0086.tar.gz
coinos-ui-7617102b14e5254c9675b7db34f12ff6906a0086.zip
qr update
Diffstat (limited to 'src/routes/(app)/[username]/accepted')
-rw-r--r--src/routes/(app)/[username]/accepted/[text]/+page.server.ts7
-rw-r--r--src/routes/(app)/[username]/accepted/[text]/+page.svelte51
-rw-r--r--src/routes/(app)/[username]/accepted/[text]/raw/+server.ts16
-rw-r--r--src/routes/(app)/[username]/accepted/create/+page.svelte64
4 files changed, 138 insertions, 0 deletions
diff --git a/src/routes/(app)/[username]/accepted/[text]/+page.server.ts b/src/routes/(app)/[username]/accepted/[text]/+page.server.ts
new file mode 100644
index 00000000..ca23ae53
--- /dev/null
+++ b/src/routes/(app)/[username]/accepted/[text]/+page.server.ts
@@ -0,0 +1,7 @@
+export async function load({ params, url }) {
+ const { text } = params;
+ const query = new URLSearchParams(url.search);
+ const nfc = !!query.get("nfc");
+ console.log("NFC", nfc);
+ return { nfc, text };
+}
diff --git a/src/routes/(app)/[username]/accepted/[text]/+page.svelte b/src/routes/(app)/[username]/accepted/[text]/+page.svelte
new file mode 100644
index 00000000..cfd9961f
--- /dev/null
+++ b/src/routes/(app)/[username]/accepted/[text]/+page.svelte
@@ -0,0 +1,51 @@
+<script>
+ import Icon from "$comp/Icon.svelte";
+ import Qr from "$comp/Qr.svelte";
+ import { back, copy } from "$lib/utils";
+ let { data } = $props();
+ let { nfc, text } = $derived(data);
+ let { username } = $derived(data.subject);
+ let url = `https://coinos.io/p/${username}`;
+</script>
+
+<div class="px-2">
+ <div class="border-8 border-black p-8 max-w-[710px] mx-auto mt-20 space-y-5">
+ <div class="flex gap-2 mx-auto justify-center">
+ <img src="/images/bitcoin.png" class="w-16 h-16 my-auto" />
+ <h3 class="text-5xl font-bold text-center my-auto">Bitcoin Accepted Here</h3>
+ </div>
+ <Qr {text} />
+ <div class="text-center text-4xl font-bold">coinos.io/{username}</div>
+ {#if nfc}
+ <div class="flex w-full justify-center gap-4 mt-10 text-2xl">
+ <div class="gap-1">
+ <div class="flex items-center gap-2">
+ <img
+ src="/images/tap.png"
+ class="mx-auto my-auto"
+ style="width: 120px"
+ />
+ <img src="/images/icon.svg" class="my-auto w-12" />
+ <div>Coinos</div>
+ </div>
+ </div>
+ <div class="ml-auto gap-1">
+ <div class="flex items-center gap-1">
+ <iconify-icon
+ noobserver
+ icon="ph:lightning-fill"
+ class="text-yellow-300"
+ width={48}
+ ></iconify-icon>
+ <div>Other</div>
+ <img
+ src="/images/tap.png"
+ class="ml-auto my-auto"
+ style="width: 120px"
+ />
+ </div>
+ </div>
+ </div>
+ {/if}
+ </div>
+</div>
diff --git a/src/routes/(app)/[username]/accepted/[text]/raw/+server.ts b/src/routes/(app)/[username]/accepted/[text]/raw/+server.ts
new file mode 100644
index 00000000..a24d3a3c
--- /dev/null
+++ b/src/routes/(app)/[username]/accepted/[text]/raw/+server.ts
@@ -0,0 +1,16 @@
+import Qr from "qrcode-base64";
+
+export async function GET({ params }) {
+ const { text } = params;
+
+ const dataUri = Qr.drawImg(text, { size: 600 });
+ const base64Data = dataUri.split(",")[1];
+ const binaryData = Buffer.from(base64Data, "base64");
+
+ return new Response(binaryData, {
+ headers: {
+ "Content-Type": "image/gif",
+ "Cache-Control": "public, max-age=31536000, immutable",
+ },
+ });
+}
diff --git a/src/routes/(app)/[username]/accepted/create/+page.svelte b/src/routes/(app)/[username]/accepted/create/+page.svelte
new file mode 100644
index 00000000..74316ba9
--- /dev/null
+++ b/src/routes/(app)/[username]/accepted/create/+page.svelte
@@ -0,0 +1,64 @@
+<script>
+ import { run, preventDefault } from 'svelte/legacy';
+
+ import { goto } from "$app/navigation";
+ import { browser } from "$app/environment";
+ import { t } from "$lib/translations";
+ import Icon from "$comp/Icon.svelte";
+ let el = $state(), text = $state(), pasted = $state();
+
+ let keypress = (e) =>
+ e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false);
+
+ let paste = async () => {
+ text = await navigator.clipboard.readText();
+ pasted = true;
+ };
+
+ let submit = () => goto(`/qr/${encodeURIComponent(text)}`);
+
+ run(() => {
+ if (browser && pasted && text) el.click() && (pasted = false);
+ });
+</script>
+
+<div class="container px-4 max-w-lg mx-auto space-y-5 mt-20">
+ <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">
+ Create QR
+ </h1>
+
+ <form onsubmit={preventDefault(submit)} class="space-y-2 text-xl">
+ <div class="mb-2">
+ <textarea
+ use:focus
+ name="text"
+ placeholder="Enter some text or a URL to put in a QR"
+ onkeypress={keypress}
+ class="w-full p-4 border rounded-xl h-32 text-xl"
+ bind:value={text}
+ onpaste={() => (pasted = true)}
+ autocapitalize="none"
+></textarea>
+ </div>
+
+ <div class="flex gap-2">
+ <button
+ type="button"
+ class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full bg-primary justify-center gap-2"
+ onclick={paste}
+ >
+ <Icon icon="paste" style="w-8 my-auto" />
+ <div class="my-auto">{$t("user.send.paste")}</div>
+ </button>
+
+ <button
+ bind:this={el}
+ type="submit"
+ class="flex bg-black text-white border rounded-2xl px-6 py-5 w-full font-bold gap-2 justify-center"
+ >
+ <Icon icon="send" style="w-8 my-auto invert" />
+ <div class="my-auto">{$t("user.dashboard.go")}</div>
+ </button>
+ </div>
+ </form>
+</div>